package com.itheima.config;

import org.springframework.lang.Nullable;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Calendar;

/**
 * 自定义一个拦截器类
 *
 * 功能：当用户请求的路径以"/admin"开头且未登录时，拦截器将重定向到"/toLoginPage"路径，
 *      即要求用户登录后才能访问"/admin"开头的路径。
 *      如果用户已登录或请求的路径不是以"/admin"开头，则允许请求继续处理
 * 访问：http://localhost:8080/admin
 */
@Component
public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
                             Object handler) throws Exception {
        //通过HttpServletRequest对象的getRequestURI方法获取当前请求的URI（统一资源标识符），即请求的路径。
        String uri = request.getRequestURI();
        //获取登录用户信息
        Object loginUser = request.getSession().getAttribute("loginUser");
        //判断请求的路径是否以"/admin"开头，并且登录用户信息为null，即用户未登录。
        if (uri.startsWith("/admin") && null == loginUser) {
            //如果请求路径以"/admin"开头且用户未登录，则将响应重定向到"/toLoginPage"路径，即跳转到登录页。
            response.sendRedirect("/toLoginPage");
            //如果返回false，表示拦截器拦截了该请求，并终止后续的请求处理流程。如果返回true，表示允许该请求继续处理
            return false;
        }
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response,
                           Object handler, @Nullable ModelAndView modelAndView) throws Exception {
        request.setAttribute("currentYear", Calendar.getInstance().get(Calendar.YEAR));
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse
            response, Object handler, @Nullable Exception ex) throws Exception {
    }
}

